home *** CD-ROM | disk | FTP | other *** search
/ Practical Algorithms for Image Analysis / Practical Algorithms for Image Analysis.iso / TARFILE.GZ / tarfile / ch_3.2 / lpfltr / convolve1.c next >
Encoding:
C/C++ Source or Header  |  1999-09-11  |  2.4 KB  |  78 lines

  1. /* 
  2.  * convolve1.c
  3.  * 
  4.  * Practical Algorithms for Image Analysis
  5.  * 
  6.  * Copyright (c) 1997, 1998, 1999 MLMSoftwareGroup, LLC
  7.  */
  8.  
  9. /* CONVOLVE1:   function performs 2-D convolution by separable, 
  10.  *            symmetric, 1-D filter mask
  11.  *                  usage: convolve1 (imgIO, fltr1D, nFltr)
  12.  */
  13.  
  14. #include <images.h>
  15. #include <tiffimage.h>
  16.  
  17. void
  18. convolve1 (imgIO, fltr1D, nFltr)
  19.      Image *imgIO;              /* input/output image structure */
  20.      long *fltr1D;              /* 1-D of filter mask */
  21.      long nFltr;                /* number of filter coefficients */
  22. {
  23.   Image *imgT;                  /* intermediate image structure */
  24.   unsigned char **imgIOn,       /* input/output image */
  25.   **imgInt;                     /* intermediate image */
  26.   long width, height;           /* size of image */
  27.   long sumFltr;                 /* sum of fltr coefficients */
  28.   long sum;                     /* sum of filter convolution at a pixel */
  29.   long midFltr;                 /* middle coefficient index of filter */
  30.   long xEnd, yEnd;              /* end coefficients of convolution */
  31.   long x, y, i;
  32.  
  33. /* intermediate image for result of row-wise convolution */
  34.   imgIOn = ImageGetPtr (imgIO);
  35.   height = ImageGetHeight (imgIO);
  36.   width = ImageGetWidth (imgIO);
  37.   imgT = ImageAlloc (height, width, 8);
  38.   imgInt = ImageGetPtr (imgT);
  39.  
  40. /* find sum of filter coefficients */
  41.   for (i = 0, sumFltr = 0; i < nFltr; i++)
  42.     sumFltr += fltr1D[i];
  43.  
  44. /* perform row-wise convolution */
  45.   midFltr = (nFltr - 1) / 2;
  46.   xEnd = width - midFltr;
  47.   for (y = 0; y < height; y++) {
  48.     for (x = midFltr; x < xEnd; x++) {
  49.       sum = fltr1D[midFltr] * imgIOn[y][x];
  50.       for (i = 1; i <= midFltr; i++)
  51.         sum += fltr1D[i + midFltr]
  52.           * (imgIOn[y][x - i] + imgIOn[y][x + i]);
  53.       imgInt[y][x] = (unsigned char) (sum / sumFltr);
  54.     }
  55.   }
  56.  
  57. /* perform column-wise convolution */
  58.   yEnd = height - midFltr;
  59.   for (y = midFltr; y < yEnd; y++) {
  60.     for (x = midFltr; x < xEnd; x++) {
  61.       sum = fltr1D[midFltr] * imgInt[y][x];
  62.       for (i = 1; i <= midFltr; i++)
  63.         sum += fltr1D[i + midFltr] * (imgInt[y - i][x] + imgInt[y + i][x]);
  64.       imgIOn[y][x] = (unsigned char) (sum / sumFltr);
  65.     }
  66.   }
  67.  
  68. /* set border regions to zero */
  69.   for (y = 0; y < height; y++)
  70.     for (x = 0; x < midFltr; x++)
  71.       imgIOn[y][x] = imgIOn[y][width - x - 1] = 0;
  72.   for (y = 0; y < midFltr; y++)
  73.     for (x = 0; x < width; x++)
  74.       imgIOn[y][x] = imgIOn[height - y - 1][x] = 0;
  75.  
  76.   return;
  77. }
  78.